import logging
from logging.handlers import RotatingFileHandler
import colorlog

# 内置日志等级一览
# 等级名称	数值
# NOTSET    0
# DEBUG     10
# INFO      20
# WARNING   30
# ERROR     40
# CRITICAL  50
# 数值越小，优先级越低（越不严重）

# 自定义日志级别 IGNORE
IGNORE_LEVEL = 5  # 设置 IGNORE 的日志级别值为 5
logging.addLevelName(IGNORE_LEVEL, "IGNORE")

# 定义一个新的日志方法，用于记录 IGNORE 级别的日志
def ignore(self, message, *args, **kwargs):
    if self.isEnabledFor(IGNORE_LEVEL):
        self._log(IGNORE_LEVEL, message, args, **kwargs)

# 将 ignore 方法绑定到 logging.Logger 类
logging.Logger.ignore = ignore

# 创建日志格式器，使用 colorlog 的 ColoredFormatter
formatter = colorlog.ColoredFormatter(
    '%(log_color)s%(asctime)s %(levelname)-8s %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    reset=True,  # 在日志后重置颜色
    log_colors={
        'DEBUG': 'cyan',        # 调试信息为青色
        'INFO': 'green',        # 信息为绿色
        'WARNING': 'yellow',    # 警告为黄色
        'ERROR': 'red',         # 错误为红色
        'CRITICAL': 'bold_red',  # 严重错误为粗体红色
        'IGNORE': 'white'       # 自定义的 IGNORE 级别为白色
    }
)

# 创建控制台处理器，设置日志级别为 INFO
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)  # 控制台输出 INFO 级别及以上
console_handler.setFormatter(formatter)

# 创建 RotatingFileHandler，设置最大文件大小为 4MB，最多保留 16 个备份文件
file_handler = RotatingFileHandler(
    'app.log',
    maxBytes=4 * 1024 * 1024,  # 每个文件最大为 4MB
    backupCount=16             # 保留最多 16 个备份文件
)
file_handler.setLevel(IGNORE_LEVEL)  # 文件输出 DEBUG 级别及以上
file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)-8s %(message)s'))

# 获取 root logger 并设置日志级别为 DEBUG
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# 添加控制台和文件处理器
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 打印不同级别的日志信息
logger.debug('这是调试信息')   # 控制台和文件都会记录
logger.info('这是信息')       # 控制台和文件都会记录
logger.warning('这是警告')     # 控制台和文件都会记录
logger.error('这是错误')       # 控制台和文件都会记录
logger.critical('这是严重错误')  # 控制台和文件都会记录
logger.ignore('这是忽略级别的信息')  # 只在代码中使用 IGNORE 级别
